package com.gupaoedu.pattern.singleton.lazy;

/**
 * 2019/5/10
 * created by chenpp
 */
/**
 * 懒汉式单例
 * 优点:只有在使用的时候才会初始化，不会造成内存浪费
 * 使用了DoubleCheck保证线程安全
 * 缺点:在cpu层面的实例化是可以分为几个指令的
 * 1)分配内存空间给这个对象
 * 2）创建对象
 * 3)将instance指向刚分配的内存空间
 * 其指令的重排序可能会导致线程安全问题--->推荐使用volidate来解决指令重排序问题
 *
 * */
public class LazyDoubleCheckSingleton {
    private static LazyDoubleCheckSingleton instance = null;
    private LazyDoubleCheckSingleton (){
        if(instance!=null){
            throw new RuntimeException("单例模式下不允许构造多个实例!");
        }
        System.out.println("初始化DoubleCheck单例");
    }
    public static LazyDoubleCheckSingleton getInstance(){
        if(instance==null){
            synchronized (LazySimpleSingleton.class){
               if(instance==null){
                   instance  = new LazyDoubleCheckSingleton();
                }
            }
        }
        return instance;
    }
}
